home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 7: Sunsite / Linux Cubed Series 7 - Sunsite Vol 1.iso / system / shells / scsh-0.4 / scsh-0 / scsh-0.4.2 / scsh / jcontrol1.c < prev    next >
C/C++ Source or Header  |  1995-10-26  |  2KB  |  96 lines

  1. #include <unistd.h>
  2. #include <sys/types.h>
  3. #include <signal.h>
  4. #include "cstuff.h"
  5.  
  6. extern int errno;
  7.  
  8. /* Hack the blocked-signal mask.
  9. *******************************************************************************
  10. */
  11.  
  12.  
  13. #include "machine/sigset.h"
  14.  
  15. int set_procmask(int hi, int lo, int *old_lo_p)
  16. {
  17.     sigset_t mask, old_mask;
  18.     int old_hi;
  19.  
  20.     make_sigset(&mask, hi, lo);
  21.     
  22.     sigprocmask(SIG_SETMASK, &mask, &old_mask);
  23.     split_sigset(old_mask, &old_hi, old_lo_p);
  24.     return old_hi;
  25.     }
  26.  
  27.  
  28. int get_procmask(int *old_lo_p)
  29. {
  30.     sigset_t old_mask;
  31.     int old_hi;
  32.  
  33.     sigprocmask(SIG_SETMASK, NULL, &old_mask);
  34.     split_sigset(old_mask, &old_hi, old_lo_p);
  35.     return old_hi;
  36.     }
  37.  
  38.  
  39. /* Set/Get signal handlers
  40. *******************************************************************************
  41. */
  42.  
  43. long int pending_signals = 0;
  44. void scm_handle_sig(int sig) {pending_signals |= (1<<sig);}
  45.  
  46.  
  47. scheme_value set_int_handler(int sig, scheme_value handler, int flags,
  48.                  scheme_value *ohandler, int *oflags)
  49. {
  50.     struct sigaction new, old;
  51.  
  52.     sigemptyset(&new.sa_mask); /* WTF */
  53.     new.sa_flags = flags;
  54.  
  55.     if( handler == SCHFALSE ) new.sa_handler = SIG_IGN;
  56.     else if( handler == SCHTRUE ) new.sa_handler = SIG_DFL;
  57.     else {
  58.     new.sa_handler = scm_handle_sig;
  59.     /* Do other stuff. */
  60.     }
  61.  
  62.     if( sigaction(sig, &new, &old) ) {
  63.     *ohandler = SCHFALSE;
  64.     return ENTER_FIXNUM(errno);
  65.     }
  66.  
  67.     *oflags = old.sa_flags;
  68.     if( old.sa_handler == SIG_IGN ) *ohandler = SCHFALSE;
  69.     else if( old.sa_handler == SIG_DFL ) *ohandler = SCHTRUE;
  70.     else if( old.sa_handler == scm_handle_sig ) {
  71.     *ohandler = ENTER_FIXNUM(0); /* Fix later. */
  72.     }
  73.     else *ohandler = ENTER_FIXNUM(-1); /* Unknown signal handler. */
  74.     return SCHFALSE;
  75.     }
  76.  
  77.  
  78. scheme_value get_int_handler(int signal, scheme_value *handler, int *flags)
  79. {
  80.     struct sigaction old;
  81.  
  82.     if( sigaction(signal, NULL, &old) ) {
  83.     *handler = SCHFALSE;
  84.     return ENTER_FIXNUM(errno);
  85.     }
  86.     
  87.     *flags = old.sa_flags;
  88.     if( old.sa_handler == SIG_IGN ) *handler = SCHFALSE;
  89.     else if( old.sa_handler == SIG_DFL ) *handler = SCHTRUE;
  90.     else if( old.sa_handler == scm_handle_sig ) {
  91.     *handler = ENTER_FIXNUM(0); /* Fix later. */
  92.     }
  93.     else *handler = ENTER_FIXNUM(-1); /* Unknown signal handler. */
  94.     return SCHFALSE;
  95.     }
  96.